Long polling earns its place when you need server-to-client updates but cannot rely on WebSockets. That happens behind strict corporate proxies that block the WebSocket upgrade, on legacy browsers, or when your infrastructure (some CDNs, older load balancers) handles plain HTTP much more reliably than long-lived socket connections. It is also simpler to reason about because every exchange is a standard request and response that you can cache, log, and debug with normal HTTP tools.
The cost is overhead. Every cycle pays for a full HTTP request and response, including headers, and a new connection setup if keep-alive is not in play. Under high message rates the client spends most of its time reconnecting, which is wasteful compared to a single persistent WebSocket. Latency also has a floor: there is a small gap between one response closing and the next request opening, and any event landing in that gap waits for the next cycle.
For genuinely high-frequency, two-way, low-latency traffic such as multiplayer games, collaborative editors, or live trading, WebSockets are the better fit. For one-way streams of updates like notifications or a live feed, Server-Sent Events are simpler. Long polling is the pragmatic middle ground: more real-time than fixed-interval polling, more compatible than WebSockets, and good enough for moderate update rates.