GMail does a good job of being up to date, except when switching networks or resuming from sleep. It'll certainly eventually sync properly, but that can take minutes, and whacking the Refresh button fixes that in seconds.
I've also found that Refresh will surface very-new mail sooner than just waiting. Whacking Refresh while waiting for an email verification or password reset always makes it appear faster than just waiting.
I feel the difference between a programmer/power user and a regular user, and something that we need to start explaining to regular users, is that UI is not the true state of things. What you see is not what is really there. What you see is a representation, that is usually manipulated incrementally. A refresh is a request to rebuild the representation anew, from the true state of things.
For example: Instagram does auto sync of new posts, but it also has a refresh functionality. So I never know if it is up to date and I must refresh. When you know about a manual refresh functionality the auto update is totally useles. You're never sure if the app tries to stay up to date or does only occasionally sync to show some (not the latest) updates.
Another example is google mail, it does auto sync pretty well and I always see the mails when they arrive. But the refresh buttons makes me suspicious if it's really up to date (in my experience it always is).