Vertex buffers/batching is still immediate mode, in fact I would argue that a pattern like glBegin()/glEnd() is more retained than immediate mode since it's a high-level abstraction where the runtime has to ultimately build up vertex streams internally at some point. Using vertex buffers is closer to how the hardware interface actually works, streams of geometry and drawing commands sent over DMA.