Connecting piezo buzzer with BJT
The piezo buzzer use piezoelectric effect to emit sound (the material in the buzzer deform itself due to voltage, deformation will be "proportional" to the voltage applied). Since sound is pressure wave one have to provide oscillating voltage to the buzzer in order to produce oscillating deformations. And most important:

From the electrical perspective piezo buzzer act like capacitor! 

So why circuit with BJT and without R2 did not work?  

With BJT in the configuration that you use, BJT can only "sink" current. That is it can only lower voltage at its collector. So after first "turn on" the voltage at the collector dropped to ground (or close) level. Next turn on cycle will not change voltage across buzzer as the voltage at the collector was already at ground level. (That is why you have measured 5V across the buzzer). Since voltage across buzzer do not change buzzer will not vibrate and thus will not produce sound.  

Adding R2 solved the issue. When BJT is conducting, it lowers voltage at collector (C). When BJT is NOT conducting, R2 pull voltage up. This crates oscillation and produce sound.

Now, more interesting question is why MOSFET seemed to work (and BJT did not)?

I am not sure but here is my thory:
My guess is that you have used one of this big power mosfets. They tend to have big parasitic gate to source/drain capacitance, at the same order of magnitude as a capacitance of the piezo buzzer(hundreds of pF). This parasitic capacitance created AC coupling between your input signal and buzzer which was enough to produce sound.

Now BJT of the type you have used have much smaller capacitance (single pF) that was not enough to provide enough AC coupling (it did provide some that is why you did hear some barely audable sound)

Note: The whole issue is little more complicated then simple AC coupling, but I believe is good enough first order explanation of the phenomena.