I was thinking today and am curious, assuming there is an open collector output on two chips, one that runs on 3.3V and cannot tolerate 5.0V, and a 5.0V chip, could they just communicate by using pullup resistors with the correct voltage? What does a level shifter do that makes it worthwhile to buy?
You may not be be able to pull up the output of a 3.3V chip to 5V. But assuming that your desired direction is possible, the other issue is that the rise time resulting from the pullup resistor charging the capacitance of inputs and stray capactiance is potentially very slow compared to an active pullup, and there is a trade-off between current consumption in the 'low' state and rise time.
With a level shifter you can have very low static power consumption and high speed even with relatively large capacitive loads. For example, a 10K pullup and a 50pF load represents a time constant of about 500ns vs. the typical 4ns of a 74LVC245 (100x slower), again with a relatively large 50pF load. In some applications, that's not a big deal, in others it is.
3.3 volts may be seen by the 5 volt chip as a grey area voltage not a true absolute high. The 5 volt line can and is often lowered to a 3.3 high by one of many methods. These questions really are circuit dependent. Some systems are somewhat voltage tolerant others are not! True good engineering practice dictates always doing it the right way. But in the field it is not always either possible or expedient to do so. I have built numerous level converters to go in serial control and communications lines often buffer resistors will do the job quite well especially if the device that you are attaching to is designed with that in mind. There are also folks who deliberately through the excuse of caution make interfaces so impossible to adhere to that one gives up and spends an enormous amount of money to buy the custom interface even though in reality it was not technically necessary to the circuit or device at all! I always access the circuit and try the simplest methods first which incidentally usually work just fine.