Communication is JSON over a pipe. That means a roundtrip through the kernel and parsing overhead.
The lang server needs to maintain a duplicate document workspace state. If you have ever tried to keep 2 non-trivial data sets in sync you know that this is not easy.