Просто мне кажется, что делать каждую секунду запрос серверу на наличие новых сообщений не хорошо
Да, это называется pooling, потому придумали long pooling при котором опрос сервера происходит один раз, и ждет пока не придут какие-то данные, или соединение оборвется по таймауту. А потом снова. Это позволяет уменьшить количество запросов с 1-ого в секунду до 1 скажем в пол минуты или итого меньше. Зависит от web сервера, keep alive-ов всяких и т.д. Так же делей доставки невилируется так как мы ждем до момента получения данных.
Самым же продуктивным способом является установление постоянного соединения с сервером и двусторонних обмен данным. это позволяют сделать websockets. Одно но, если браузер пользователя не поддерживает websockets нужно делать фэлбэк в long pooling. Так же пользователь может сидеть за HTTP проксями (например, как добрая половина пользователей вконтактика, с работы) которые не понимают ничего кроме старого доброго HTTP 1.1 и режут все websocket соединения.
Для php есть ratchet.