Thank you all for your advice. I decided to take the advice of switching the logic in my code to start high and send low for the pulse, which when inverted after shifting to 12V, sends the desired signal, using the 2N222 circuit I linked above. I had thought about just switching the logic around, but being a novice, was worried that we might accidentally send a high signal before the rest of the experiment was ready.
So, we're trying to use an external trigger mechanism for an energy beam to turn on (rising edge) and off (falling edge). I had imagined that we'd get the beam ready for trigger, then run the script. The Pi circuit would send a trigger pulse and the beam would turn on and then off. But with the logic reversed, I was afraid that if we got the beam ready, the Pi circuit, inverted, would start off with high output (since the GPIO is normally low) and the beam would just be triggered immediately.
Again, being a novice, it took me a minute to realize I could add a pause in the script. So basically, inverting the logic, we run the script, it sets GPIO to high (inverted output to low), pauses and waits for any key input. Then we get the external beam ready to go. Then just hit any key to continue the script as before.
Still, I'd like to learn more and will read about MOSFETs, opto-couplers and the op-amp comparator as a way to level shift. I know each must have limits on delays, rising and falling edge times, etc.
I'm not terribly sure yet what the precision needs of our experiment is yet. We're testing the beam's external triggering system - basically, how long does it take to ramp up or shut off when we trigger it to? We have commercial, high-frequency equipment for measuring. But for control signal, we just need something that can trigger the beam for varying lengths of time. The pulse length will be on the order of 1s. The vendor guarantees beam off (what we're primarily interested in) within 100ms. I asked a vendor engineer how much better does the system perform than the guarantee and didn't know but was curious to find out. We might try to shorten the interval width as much as possible, or lengthening it, or if sending a series of pulses (beam gating), changing the interval between pulses. The vendor says there's no constraint between on and off. And at least 31 seconds between off and on, to guarantee no delay with beam on. So, I'm guessing our bandwidth needs aren't high?
So far, I've only tested the circuit against my hobby oscilloscope, and playing with the precision of beam on time, it seems like I can get something like ~10 ms variation on beam on time reliably. Since following advice here and inverting the logic, I've delivered the circuit to the lab and demo'd it using just my scope. Next week, we'll test it against the commercial scopes and try it on the beam system.