Have you tried LiveCalendarWidget?
Well, the idea for LiveCalendarWidget was to deliver a calendar tool that was aware of your events. It does that by making an ajax call to the calendar page every time the month advances, so you always have information about which days have events. Plus, it breaks the widget out of client side generation and into the MVC pattern, so it's easy to customize and rebrand. May not work for you, but something else to look into.
Yeah, my experience is that it's pretty snappy, but I am on a fairly fast connection, too.
Also, when you feed a static array to a calendar, you have to somehow provide limits on either end of the date range, but making a call to the database, you're always sure to get that set of months.
I also wonder if a several asynchronous queries for one month are more better performing than one huge one up front?