Асинхронная модель обработки сетевых соединений можно сказать что единственно верная для данной задачи.
Корень зла здесь - так называемая "проблема C10k", то есть "проблема 10 тысяч соединений":
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D...
При построении чатов эта проблема стоит особенно остро, т.к. если у Вас, например, 2000 онлайн пользователей, то и соединений с ними тоже 2000, которые необходимо поддерживать в активном состоянии в режиме реального времени.
Именно в таких случаях асинхронная модель выигрывает, потому что на каждое соединение получается очень небольшой оверхед по памяти, в отличие например от модели когда на каждое соединение создается системный поток - thread.
Теперь про возможные технологии. Написать чат на вебсокетах возможно много на чем.
Фаворитами по скорости программирования здесь будут, ИМХО, JavaScript (Node.js) и Python. По скорости же работы - Go, Erlang и прочие компилируемые языки.
Python:
1. Twisted + sockjs-twisted
2. Tornado + sockjs-tornado (уже приводили здесь)
3. Crossbar.io (
http://crossbar.io/) - комплексное решение, которое позволит сконцентрироваться на логике приложения, а не на технических вопросах.
4. Разные вариации библиотек (Authobahn.io, asyncio etc.)
JavaScript (Node.js):
1. Socket.io (
socket.io/) - достаточно известное решение, комплексное, позволяет не думать о технической части
2. SockJS (
https://github.com/sockjs/sockjs-node) - больше библиотека чем фреймворк. Например мультиплексирование (несколько "виртуальных" соединений внутри одного сокета) придется пилить вручную (правда есть библиотеки)
Хочется отметить, что вне зависимости от использования Socket.io или SockJS, настанет момент, когда Вы захотите использовать все ядра своего процессора для обработки пользовательских соединений (по одному запущенному процессу на ядро). И вот тут на Python придется вручную писать логику построения кластера из нескольких процессов.
В Node.js эту проблему решает модуль "Cluster" (
https://nodejs.org/api/cluster.html).
В принципе на Python тоже можно быстро написать этот функционал (например на Twisted), но осадочек, как говорится, остался)
По поводу скорости - JavaScript (Node.js) априори будет быстрее чем Python, т.к. там JIT компиляция.
Уравновесить ситуацию поможет PyPy - нестандартный интерпретатор Python, который тоже использует JIT-компиляцию. В этом случае разницы в скорости практически не будет заметно.
Сам я люблю и уважаю Python, поэтому порекомендую его. Хотя бы потому что в Twisted, Tornado да и asyncio есть корутины (coroutines), а в новых версиях Python даже async/await. Эти конструкции позволят Вам писать в линейном стиле и избежать лапшекода как в JavaScript.
PHP:
1. Ratchet (уже писали о нем)
2. phpDaemon
PHP рекомендовать не буду, разве что если у Вас вся система на PHP и программисты больше не знают других языков.
Если очень нужна высокая скорость и нетребовательность к ресурсам, пишите сразу на Go. Вот выше Вам уже посоветовали комплексные решения типа
Centrifugo (который кстати сначала был написан на Python + Tornado).
P. S. Забыл отметить, что если Вам нужны исключительно веб-сокеты (которые будут работать во всех современных браузерах), то Вы вообще можете отказаться от Socket.io и SockJS. Эти библиотеки хороши для обеспечения совместимости со старыми браузерами, ну или для случаев, когда вебсокеты режутся сетевым оборудованием. Эти библиотеки по-умолчанию переключат браузер в режим long-polling.
Однако если Вам все это не нужно - то не берите, тем самым уменьшите оверхед на браузер и сервер.