Buffers are basically vertex arrays, which you already know from GL2
A correction to this is that buffers are actually available in GL 1.5; it's quite incorrect to think of them as a new, bleeding-edge, fancy, or whatever feature, because they're not.
You are of course right (at least for vertex data). But that's not quite what I wanted to imply.
To explain, allow me to object that "buffers were already present in GL 1.5" is a bit like saying "Shaders were part of GL 2.0 already". They certainly were, but like buffers they were merely a very limited "fancy addition", or gimmick, not the one exclusive, main paradigm. Everybody using GL 2.0 knew Begin/End inside out, and everybody knew vertex arrays. Most people had probably heard of buffers, and of that thing called fragment shader. Some may even have used them. But it was not "the" mainstream paradigm, and each of these gimmicks was limited to very specific special cases.
In GL3/4, there exists no other thing. It is the only paradigm (except in compatibility mode, which is kind of "cheating").
Everything is about "buffers and shaders", and about having client and server run as asynchronously as possible (plus, more features, bigger textures, bigger viewports, more attachments, generally bigger limits, fences and queries, instancing, indirect calls, etc etc...).