Starting at the lowest level, XMPP streams are framed by the 2nd level elements in an XML document. Clients and server must keep an XML parser open for the lifetime of the connection. If you don't have a parser like expat available, then you either need to dedicate a thread to the connection or use ugly regex style hacks to handle the framing. Almost any other framing mechanism in use today would have been easier to use (null bytes between messages, length prefixed messages, and so on).
Moving up a level, the use of XML namespaces is over designed. XMPP uses unique namespaces for each type of connection (client to server, server to server, component to server). This provides no benefit to any party and is ugly for server developers where they need to deal with all types of connections.
I could go on. I have not even gotten to the application layer (RFC 3921).
Other protocols have warts, but not like those that I have encountered in XMPP.