princec is right if you want bleeding-edge performance. However, vertex arrays are still very fast (surely fast enough for most 2D games). VBOs are generally faster. Mapped VBOs seemed to be the fastest, aside from GL3 solutions like instancing, texture arrays or geometry shaders.
If you want to start writing your own sprite batcher, you have a bit of work in store for you. Especially if you choose the programmable pipeline (which will give you much more power and flexibility).
Understanding
Textures is an essential first step. You can see my intro to sprite batchers
here.
The API source code is relatively minimal and will give you all you need for a high performant (shader based) sprite batcher.