Even though OutgoingSessionPromise was using a ThreadPool, the pool was configure with 5 core thread and an unbounded queue. ThreadPool will then prefer to queue packets instead of creating new threads so in practice this means that we were only using 5 thread to establish new outgoing connections to remote servers.
New system properties:
xmpp.server.outgoing.max.threads (default 20)
xmpp.server.outgoing.queue (default 50)