If you want an oddly shaped texture all you have to do is make sure that your texture fits inside one of the larger textures. Then what you do is when you apply the texture to the polygon bind it from the corner of the texture and only apply the portion of the texture that you need to the polygon.
I believe that the reason for the size requirement is because of byte boundaries with hardware. Hardware and software can be optimized greatly by statically defining texture sizes. Obviously the performance increase is substantial due to its usage.
The space on the texture that you aren''t using doesn''t have to be empty memory either. You can put other stuff in there, other textures that is. You just have to bind the right part of the texture to the target polygon. Of course you''ll have to include data with the texture that outlines where a certain texture begins on the texture pictures.