The properties of a message as well as the message body and all strings of the message are in a byte stream format upon receive of a message. The property byte stream is converted into a Map with name/value of the properties. This is done on the first call to getXProperty(name). Subsequent calls will use the Map and will just do a lookup with a conversion to the resp. property type, e.g. from Integer to int. That' all. So if you measure, you should differ between the first and subsequent getXProperty calls.
The reason why MessageImpl.writeContent [our internal serialization] is faster is simple - it just writes the byte streams of the message (props, body, strings).
Concerning consumer produces too much load. There are 2 threads involved. One is reading from the TCP input stream, deserializes and dispatches it into the appropriate session queue which is served from another thread which then calls onMessage.