What you're asking for doesn't make sense.
You contend that, after the initial handshake, websockets are just TCP sockets.
But they're not. A websocket is a stream of messages, not a stream of bytes. As explained by Protocol Overview:
After a successful handshake, clients and servers transfer data back
and forth in conceptual units referred to in this specification as
"messages". On the wire, a message is composed of one or more
frames. The WebSocket message does not necessarily correspond to a
particular network layer framing, as a fragmented message may be
coalesced or split by an intermediary.
A frame has an associated type. Each frame belonging to the same
message contains the same type of data. Broadly speaking, there are
types for textual data (which is interpreted as UTF-8 RFC3629
text), binary data (whose interpretation is left up to the
application), and control frames (which are not intended to carry
data for the application but instead for protocol-level signaling,
such as to signal that the connection should be closed). This
version of the protocol defines six frame types and leaves ten
reserved for future use.
See Design Philosophy for why it works this way, and Data Framing for more complete details.
So, if you just take the TCP socket out from underneath a websocket and start sending unframed data, the other side will not understand you, and will just disconnect.
(You'll also break most proxies, since proxy support depends on frame masking if you're not using TLS, and clean-shutdown handling, but if you can't even do the most basic point-to-point communications, who cares?)
Of course you can build an API on top of websockets that exposes a connection-oriented and reliable (like TCP) but datagram-based (like UDP) socket interface and then pretend you're not using websockets… but if you're looking for real-time, low-latency networking, adding another layer that makes it hard to get as close to the metal as possible when you find things you need to optimize doesn't seem like a good idea. Or, if you do want that, I suspect you'd be better off building a tightly-optimized gateway that talks localhost UDP to your actual servers and websockets to your clients.
Meanwhile, you claim that something like asyncio or twisted
… isn't suitable because 1) network loop isn't going to be main loop here and 2) sockets are only used to transport data back and forth and nothing more.
Both asyncio and twisted (although not most other networking libraries) allow you to drive their message loop from another loop, by just running one iteration of the loop manually instead of running forever.
How else are sockets used, anywhere?
epollorselectto see if there's something to read isn't very helpful, because unless there's the final frame of a message, there's still nothing to process.