Luckily, there are ways to reduce syscalls (like Generic Segmentation Offload and other tricks[1]). But I agree that not having things run in the kernel makes it more challenging for high-throughput scenarios.
[1] https://blog.cloudflare.com/accelerating-udp-packet-transmis...