I've done that (PWM control a PC muffin fan). You need to be sure that the PWM frequency is high enough not to alias with the switching speed of the fan at any RPM, otherwise the fan will tend to "jump" in speed at the alias point, then the loop will try to correct it and the fan will hunt "zoom..... slow....zoom...slow....".
Or, use a parallel capacitor to smooth out the PWM into a reasonably clean DC level so that the fan can't alias with the PWM frequency.
We're talking about PC fans with a separate PWM input, so the above doesn't apply. However, the Intel PWM fan specification calls for the PWM to be at 25kHz, +- 2kHz AFAIR.
Actually, I was talking about a plain old 3 wire fan (power, ground and tach output).
When the fan is spinning, the hall sensor switches the two phases back and forth (acting like the commutator on a DC brush motor). Obviously, this occurs at a rate (frequency) proportional to the fan RPM. If the PWM frequency of the driver is near the switching rate of the fan motor, strange things will happen. I know this because I've had the problem and figured out what it was.
I was NOT talking about a 4 wire "Intel style" PWM speed controlled fan, I was talking about using Arduino PWM + switching transistor to control an ORDINARY fan.