I forgot … One more thing.
Perhaps, the best way to pack more data per track is to use no sectors at all. Each sector has some overhead, gaps and header. Without sectors, just raw track, you save all the overhead. It is a bit less reliable, but as long as you implement some custom checksum (FDC won’t help you without sectors), is not that bad.
There are two problems though. First problem is that the FDC can't write arbitrary data outside sectors, which must be done when formatting the track. Some bytes are interpreted by the FDC as special formatting commands. But let's assume that we use a custom controller to overcome this limitation. The FDC still can't even read arbitrary data outside sectors, using the read track command. Some bit patterns will trigger the sync mark detector, forcing the FDC to skip some bits and even worse, start reading from the clock pattern instead of the data pattern.
But because the bit patterns that provoke this are known, you can use some encoding to avoid them. For instance, escape some bytes to avoid the patterns. This is not just an idea, and it is not even mine. Some games do implement this scheme.
Of course, the encoding, whatever one you use, will add some overhead. Then it might depend on the actual data if you gain something (vs using sectors) or not. It might be an issue of perform some statistics to calculate the average. Anyway, just wanted to comment on the nice idea (which again, is not mine).