Other nice people on this comment thread pointed out that I can bring it down to 8, I had just missed some simple tricks I could do (like overriding the object data with the forwarding pointer since that data is garbage anyway).
So 8 bytes per allocation sounds about right.
How do you deal with variable size types like arrays?