Consider
In[4]:= f[x_] := D[x a, a]
In[5]:= f[b]
Out[5]= b
In[6]:= f[a]
Out[6]= 2 a
which is just one simple example of why Block doesn't localize the "usual way" (it uses dynamic scoping).
Block does have its uses. If we were to implement something similar to Table and localize the iterator, Block would be the choice.
Choose between Module and Block depending on what they do, not performance. They are quite different.
Reading: What are the use cases for different scoping constructs?