I liked this CBOR vs MsgPack article from a while back (which also talks about size on the wire, not just performance):
https://diziet.dreamwidth.org/6568.html
SBE (Simple Binary Encoding) also makes some interesting performance claims.
My pet peeve with both protobuf and capnp is the lack of an option type; they seem to be designed for languages with type systems that include null, rather than more modern languages like Rust or Kotlin.