Have you tried changing the calendar syncing to fetch every hour (or whatever) instead of push? Not that it shouldn't push reliably, but I've found that fetching is almost as good and doesn't use as much battery life.
There are many threads on here about potential fixes for push not working correctly.