the class of a symbol determines the spacing around it and how other symbols get attached. I believe the default class is inherited from Unicode, so this behavior is expected.
For completeness: the class of the tack symbol in Unicode is “relation”, the same as the equal sign and arrows for example. So the same mechanism that ensures that =^"text" gets the text on top (rather than in the corner), also makes tack_... get the attachment below the symbol.