Classic OpenGL is anything but low level, and quite fun to learn. But it turns out it's a poor model for modern hardware (as opposed to early 90s SGI graphics workstations with architectures very different from modern GPUs), which resulted in impedance mismatches that made writing performant drivers (and performant client code) quite difficult. So modern graphics APIs went down an abstraction layer or two to make it easier to write code that corresponds to how GPUs actually work. But programming against something like raw Vulkan requires a vast amount of boilerplate code (that used to be handled by the driver) to get anything on screen, so a reasonable middle ground probably looks something like OpenGL 4.