Yes, collaboration is necessary, and yes, my company is doing it wrong. My preference would be to hash out a design earlier, before there is any code, rather than after the fact. Once you have code, you have wasted time, and it is often difficult to separate out ideas from implementation.
And yes, for me personally, pair programming is a horrible idea no matter what. Pair programming vs. code reviews is a false choice. Ideal for me is design up front, away from the keyboard, and then everyone goes off, by themselves, and does their thing. Or in pairs, if that works for both of them.