Contacts doesn't seem viable at this time as it misses fields when synching.
I agree that this is currently very clunky out of the box. But I am now very happy with
SyncInABlink for my Google<->Iphone contact synching.
Although occassionally something odd will happen, such as Google suddenly decides that one of my contact's phone numbers isn't there any more, and thus will try to erase it on the iPhone, the beauty of SyncInABlink is that it SHOWS me, in excruciating detail, exactly what changes got made in that last sync and gives me a permanent history of every change it has ever made. And if the change is a genuine conflict, it gives me a chance to resolve the conflict right there in the UI. All in all, very nice and convenient. Plus it can automatically email me a CSV backup of the contact list whenever I ask it to.