I imagine the way it might go is that the client would first send an HTTP request to an endpoint that returns routing instructions, and then use that in the custom headers it sends when initiating the WebSocket connection.
Haven't tried this myself though.
i.e, what are you buying with events streamed to client vs polling and "get me events later than I have". A robust protocol ends up looking like websockets being a way to say "something happened" but refreshes and reconnects are always running the "please catch me up on everything" case.
Of course you do want to make sure the client has exponential backoff and jitter when reconnecting, as to avoid thundering herd problems.
The relevant state will need to be available to all servers as well. Anything that's only known to the original server will be lost as it drops connections. On a modern deployment with a database and probably redis available this isn't too big of an ask.