1cf1d8c1ed069fc3833b9750abd6af7d7d042a83 should be solved differently (please revert). That patch just requires almost every string in 1.8 and 1.9 to be walked once during creation to determine if all characters are more than one byte or not. I am pretty sure this will have a significant impact on string performance.
Ultimately, anything which wants to work with a string in 1.9 mode should hit logic which recognizes we have not determined coderange yet and then do the costly walk. Ultimately, we a missing some of that logic somewhere (coderange is a brittle icky thing, but we followed MRI's lead on this).
I really really wish we had nice isolation between 1.8 and 1.9 code paths too