You are mixing up API
functionality with API
design. Please don't, they are not the same thing: OpenGL 3.3/4.0 is modern in functionality but legacy-ridden in design. The original OpenGL 3.0 proposal would have fixed both issues in one go but the design was scrapped as too ambitious. The resulting spec only fixed 50% of the issue (functionality), leaving the broken design intact.
Why is the design broken? Because it forces you to either stall the pipeline or aggressively reset state for every single operation. Want to stream in model data without disrupting rendering? You have to save the current array object binding (introducing a stall), bind the new array object, stream the data and finally restore the original array object. Same thing for element array objects, vertex array objects, textures, renderbuffers, framebuffers, pixel buffers and programs, multiplied by the number of middleware libraries you are currently using (want to use a 3d model loader? Maybe a text renderer or a UI library? Better save all your state because they might trample everything).
None of this should be necessary in a modern API. None of this
is necessary in Direct3d.
Just take a look at the
suggestion thread for OpenGL n+1. Direct state access is in nearly every single post there.