I2C operations are slower to begin with, but you could speed things up over the stock routines.

Having the pins be set in software is what usually slows things down. I've implemented these before and ended up with something around 240KHz with programmable pins.
Dedicated pins speeds it up a lot... think I got around 400KHz doing it that way (running at 64MHz).

You have to watch out with the speed and open-drain IO operation to size the pullups as required.
For faster speeds I like to use active pullups which can really speed up the low-to-high transitions vs using a resistor.
This works out well when using the MSSP since you can get much faster speeds there.