Whats the difference between the 2 methods?
The difference is that one is more portable than the other. The "direct register set" will not work very well on an Arduino Due.
There is no speed or foot-print advantage with the "direct register set" as this is often only done once in the setup of the sketch.
Which one is better?
If better is portable, maintainable, readable, etc then the answer is simple - use the API and not "direct register set".
Can I set any I2C frequency I want?
No - obviously there are some restrictions. First, the CPU frequency is scaled so it cannot generate all possible frequencies. Second, the I2C device(s) and bus will set restrictions on the maximum frequency. Longer wires and several devices will add capacity and require lower frequency. Also the device with the lowest frequency puts an upper limit. Always check the data sheets for the I2C devices.