If you're only moving a teaspoon of dirt? use a teaspoon [...] Or something like that. Something something teaspoon.
Much better said that me. Thank you.
I'll add from myself that there is also GLES (an unruly, hard to tame beast) that does not have immediate mode functions but is required to support some platforms.

Me, I created a wrapper classfor small to medium loads. It hides actual implementation (may be glVertexAttribPointer() or may be older, more basic vertex arrays) and only use it to move my teaspoons.
Why? Because this way it lets you think of *all* your data as meshes. And contains much, much less API-related code to rehaul if you have to change your rendering mechanisms later.

glFinish()
I observed modern intel drivers flat out ignore this. But legacy drivers (say, Windows XP + Gf 5200 FX) *require* this called *after* SwapBuffers, otherwise you won'y get accurate measurement
(my engine uses this value for controlling adaptive detail, alongside the fps meter)

so you spend the minimum amount of time possible on the blocking swap call.
So, rendering, *then* sh-- stuff like backround uploading of higher LODs and only then SwapBuffers...? That's... such a good idea. Why am I doing it backwards?

You can use GL timers to get the 'server' side timing,
Me, I usually get "yer ghetto intel video doesn't know that trick" and stop bothering