That is not true on Linux, where you can just make syscalls yourself. They don't even use the C ABI, even if it's pretty similar (For syscalls, the fourth argument is passed in R10 instead of RCX, since that holds the return address for sysret).
I'm asking since I want to get into (hobbyist) OS development at some point and would love to know if there's a better way to do syscalls.