Why does postgres use more space for a time with timezone than a timestamp with timezone?
time with time zone stores microseconds (8 bytes) and the time zone (4 bytes).  timestamp with time zone stores just the microseconds and converts the time zone at display time.  Because of the conceptual weirdness of the time with time zone type, the time zone needs to be stored explicitly.  You don't actually need 8 bytes to store the number of microseconds in a day, but 4 bytes wouldn't be enough.  If you really wanted to, you could probably devise a more compact storage format for time with time zone, but in practice nobody cares.