I do around 1k req/s per cpu and never see load avg above 0.5
>> "re-establish their connection back to the servers each time they receive a message or navigate to another page (or reload the page). This end up taking a big toll on the system. We're to some extent limited to how fast we can perform accept() on our sockets."
I'd expect what you're seeing is the overhead of your system creating new objects initializing requests etc rather than anything low level.
(Mibbit uses keep alive long polling XHR / websocket, using custom app server in Java +NIO)