The conio functions do talk directly to the hardware, when possible, or they are are wrappers for the system calls, for things that aren't exactly hardware related (like setting the cursor position). That's what conio is for: to write to the screen as fast as possible. So if a conio function exists, it's probably going to be as fast as anything you can implement in your own code. And since conio will change and update with changes to the system, it's better to rely on the library functions than roll your own, if you don't need to.
For reference, here's the gotoxy() function from the cx16 library:
https://github.com/cc65/cc65/blob/maste ... 6/gotoxy.s