Well, it depends on how you store your data. If you store your data in such a way that you can use vertex arrays, then use it. You don’t have to call OpenGL-functions for each vertex/normal/texturecoordinate and so on, so this is a way of gaining speed.
If you store all polygons like a linked list of polygons, or an array of polygons (where each polygonstructure holds three vertices, a normal, color and so on, for example), then the best way to draw might be using glBegin/glEnd pairs.
And interleaved arrays is almost the same as “regular” vertex arrays. Use this if it’s suitable.
The problem with calling a lot of glFoo() functions is that each function call creates a bit of overhead (the registers and return ip must be pushed on the stack). The solution is to use display lists, one call of the display list will batch execute a set of GL functions.
Sometimes a display list cannot be used, say you have dynamicly changing color values from dynamic lighting. In this case it would be optimal to use arrays.