Your solution is tidy, even if long.
Since the plugin really only allows you to retrieve information from one feed at a time, I think your command approach makes sense.
When you say that it's slow, do you mean that it's slow to create the code, or that it is slow to execute?
Another way you might consider doing this is to create a command group. Within the group, keep each calendar's feedback in its own command, but allow each command to trigger the next. To add more calendars later, you can clone the last command in your group and alter the clone as needed.
I tested this with just 3 calendars and it executes quite efficiently, but I don't have a lot of calendar events so it's difficult to know for sure.
Possible benefits of this approach are:
(1) you can change some of the details for individual calendar commands without having to scroll through a big long command;
(2) you could clone individual commands, substitute in trigger phrases and delete the trigger events, so that when you want to, you can ask for results from particular calendars rather than all calendars at once.
You, James or others may see disadvantages to my approach, or ways to improve upon it. Here is an example with 3 calendars:
<?xml version="1.0" encoding="utf-16"?>
<commandGroup open="True" name="Today's events" enabled="True" prefix="" priority="0" requiredProcess="" description="">
<command id="485" name="Today's MyCal1 events" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<action>
<cmdType>GgCal.GetDay</cmdType>
<cmdString>0&&MyCal1</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<if ifBlockDisabled="False" ifNot="True">
<ifType>(A)==(B)</ifType>
<ifParams>{LastResult}&&no events</ifParams>
<then>
<action>
<cmdType>Results.MatchConcat</cmdType>
<cmdString>{CR}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>OSD.ShowText</cmdType>
<cmdString>MyCal1: {LastResult}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</then>
<else />
</if>
<action>
<cmdType>VC.TriggerEvent</cmdType>
<cmdString>MyCal2</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<phrase>What's happening today, Tell me today's events</phrase>
</command>
<command id="488" name="Today's MyCal2 events" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<action>
<cmdType>VC.Pause</cmdType>
<cmdString>2000</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>GgCal.GetDay</cmdType>
<cmdString>0&&MyCal2</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<if ifBlockDisabled="False" ifNot="True">
<ifType>(A)==(B)</ifType>
<ifParams>{LastResult}&&no events</ifParams>
<then>
<action>
<cmdType>Results.MatchConcat</cmdType>
<cmdString>{CR}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>OSD.ShowText</cmdType>
<cmdString>MyCal2: {LastResult}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</then>
<else />
</if>
<action>
<cmdType>VC.TriggerEvent</cmdType>
<cmdString>MyCal3</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<event>MyCal2</event>
</command>
<command id="552" name="Today's MyCal3 events" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<action>
<cmdType>VC.Pause</cmdType>
<cmdString>3000</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>GgCal.GetDay</cmdType>
<cmdString>0&&MyCal3</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<if ifBlockDisabled="False" ifNot="True">
<ifType>(A)==(B)</ifType>
<ifParams>{LastResult}&&no events</ifParams>
<then>
<action>
<cmdType>Results.MatchConcat</cmdType>
<cmdString>{CR}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>OSD.ShowText</cmdType>
<cmdString>MyCal3: {LastResult}</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</then>
<else>
<action>
<cmdType>OSD.ShowText</cmdType>
<cmdString>No new TV today</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</else>
</if>
<action>
<cmdType>VC.TriggerEvent</cmdType>
<cmdString>NextCal</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<phrase>Today's MyCal3 events</phrase>
<event>MyCal3</event>
</command>
</commandGroup>
I honestly don't know if this is a better solution or even a good one. I simply offer it as an alternative. Let the debates begin!