Those that try to target everything with a single API are fooling themselves, hence why in the end they all end up with extension spaghetti and multiple code paths, while pretending to still use a single API.
Well, first of all OpenGL and OpenGL ES aren't the same thing, so depending on the versions, the set of APIs differ, already there you have some set of alternative code paths.
Then some features are only available as extensions, so you need to query for them, and then programm accordingly what is available.
Some hardware features have different extensions per vendor for the same hardware capability, so yet another execution path.
The shader compilers are quite different across vendors, some more strict than others, or different set of GLSL extensions, so yet another execution path.
Finally, even when everything works, there are driver or hardware bugs to work around, yet another execution path.
In the end it is OpenGL, portable everywhere, yet the engine looks like it is using multiple kinds of APIs just to work around every kind of issue.
Naturally having a rotating cube available everywhere is easy, the problem is having a proper engine with Unreal like capabilities (we are talking about AAA here).
Actually it's the other way round. GPU architectures can vary wildly especially when you include mobile GPUs which are tiling architectures. Graphics APIs are the least common denominator interface that makes targeting all of them possible.