First you have to understand why you need them. Then you may assess more clearly if you need them or not of if you can use the internal ones.
The I2C bus specification says that the things connected to that bus have to be be able to pull the lines low. But they should not be able to pull them high. This is the role of the pull-up resistor on that lines.
That way, if two things or more want to use the bus at the exact same time, there is no risk that one try to pull the line low when another try push it high. Which would create a bus contention, very high currents into the IO of the things and possible destruction of them.
Using pull up, if one try to pull low when another try to "release" the line. The line would go low and nothing serious happens.
The same principle apply with the ACK sent by a slave to the master. The master has to "release" the SDA line when an ACK has to be received. At that time the slave pull the SDA line low to signal the ACK.
Imagine a system without pull-ups. There should be a mean of having the lines at the high level. (a constant low level line does not have a very high throughput.... ;-) )
And we have already seen that using push-pull outputs are not working here without screwing the protocol.
About the internal pull-ups? Yes it could work. But assuming:
You use a very low speed bus. The RC formed by the line capacitance and the pull-up define how long it takes for the line to transit from low to high. If the resistors are big. Which is usually the case in embedded pull-ups, then the time may be very big. Or, as explained by @Majenko, you ensure that the capacitance of your bus remains very low. (very short lines, don't use 10+ slaves, etc.)
You check that the slaves and the master are OK to work with very slow bus. Some accept arbitrary bus speed as soon as it is below the maximum allowed. (same for rise time of the line)
You are not using a very long bus in a noisy environment.
You accept to be out of spec of the bus you are using. I mean it won't be a condition that was tested against by the I2C things that you use. You won't be able to guarantee for sure that it will work without testing by yourself on a prototype in all operating conditions.