I found the Quake 2 Model format a lot easier to work with compared to its predecessor. That makes sense, I'd imagine iD figured out what works and what does not.
When I was working on my Quake model viewer, I noted that Quake 2 models contained an optimized implementation of essentially all the commands you'd need to pass to an OpenGL context. At the time I envisioned that's how I'd make it work.
That was quite some time ago, and the landscape has changed a bit.
I was trying to get more familiar with Swift and Metal which is Apple's modern "Graphics Framework" in the vein of OpenGL 2.0+, Vulkan, DirectX.
I can't really speak to the others, other than to say Vulkan seems neat.
I picked up a book from the folks over at Kodeco formerly raywenderlich.com.
This book will introduce you to graphics programming in Metal — Apple’s framework for programming on the GPU. Build a complete game engine in Metal! By Caroline Begbie & Marius Horga.
It's a very interesting book and I would highly recommend it. It gave me the information I needed to start work on this. At the point where I decided to start working on my own game engine, I had roughly gotten to the part where I could display a model on a plane, with lighting and shadows.