If you're making a program today, you should be using some higher level framework or API than raw X11. If you program for Gtk or Qt, or make an OpenGL or Vulkan program, you mostly don't care about X11 or Wayland because i.e. Qt supports both.
You could use Xlib to program a client in pure X11, but that approach would have been outdated even 15 years ago. There's no good reason to do so today, even embedded systems often use Qt and there's good support for building embedded/Qt in Yocto. Most embedded devices that have any UI at all are likely powerful enough to run Qt, so I suspect there aren't many cases these days where you need to limit yourself to Xlib because of performance.
> You could use Xlib to program a client in pure X11
Xlib is actually not very pure X11; Xlib makes a lot of things synchronous whereas X11 is really an asynchronous messaging distributed systems protocol that happens to output to the screen as a side effect. Xcb is a much closer to the actual protocol library.
IMHO, a lot of early hate for X11 was really hate at Xlib; but as Xlib was the official library, it was understandable to get them confused.
XCB is missing support for some important extensions, though. Such as Xft, so you can't display modern anti-aliased fonts (unless you somehow use Xlib at the same as XCB, I think?).