The only other funky thing
I'm doing is parsing my environment.plist in .profile so I don't have
two sources of path information.
I bet this is the problem. TextMate will source your .profile when you run a command, in an attempt to pick up environment information that's set there. Some random thoughts:
1. When you load environment.plist from .profile, do you do so via a relative path? When TextMate sources .profile, the current working directory isn't $HOME. Try explicitly referring to "$HOME/.MacOSX/environment.plist", if you're not doing so already.
2. Failing that, if you temporarily rename .profile so that TextMate can't pick it up, does it start working then?
Robin