I prefer to write "self.foo" instead of "_foo", mostly for style reasons. In theory self.foo means a function call, while _foo doesn't. I think this ok because it's unlikely to matter much for most code.
My question is: does the compiler optimize this to the same thing anyways? Maybe it can't, due to method swizzling? Does anyone have any insight?
No, the compiler doesn't optimize it to just an instance variable access. It cannot optimize it, because the class could have a subclass that overrides the getter method. (Note that subclasses can be created at runtime!)
However, you shouldn't worry about the message-sending overhead unless you've profiled your code and determined that it's a bottleneck.