Any user-space application uses syscalls, mostly for memory (de)allocation and for I/O stuff, even though applications
rarely do that directly. They use wrapper "system" userland-libraries, such as
glibc (Linux) or
kernel32 (Windows), which provide a "high level" interface to the functionality the application needs - and do the syscalls internally, where needed. The
C Runtime adds yet another layer of abstraction between the application code and the underlying "system" libraries.
But, most important, unless the application is
extremely I/O heavy, the syscall overhead is pretty much negligible.
(And for applications that are
very I/O heavy, the syscall overhead always has been a problem! That's why people came up with ideas like mapping the MMIO addresses into user-space and thus
passing by the kernel and its drivers altogether )