Does it just set an internal variable to the passed buffer or does it have to do much more?
Every GL call does slightly more, i.e. first getting a reference to the context that is current to the thread, then some error checking based on the arguments. But apart from that, glBindBuffer should have a small cost.
Is this different for index buffers? As it seems for this all you have to do is bind it.