Ended up replacing the O2 today. Was quite simple as expected... Car feels like it runs much smoother and I seem to have a good bit of performance back on the top end.
This time when we pulled the codes before we deleted them, we got misfires on all cyl's except for #1. I'm guessing this is simply from dumping too much fuel.
I drove it about 10 miles and the code hasn't come back but I won't be convinced for a week or so. I'll update in a bit one way or the other.
Thanks again elm3 for your offer to help and for your help here, and to everyone else who contributed! Let me know if you attend any local BMW meets, i'd still be happy to make an m3 buddy!