After trying MakOwner's solution to no avail, I think I solved it for my case.
At bootup I noticed in dmesg that eth1 was coming up before eth0, probably due to some unpredictable hardware timing. To make things worse, I saw that the link states for eth0 and eth1 would sometimes go up a few seconds after bond0 went up. Perhaps the bond was polling for the link status of eth0 and eth1, cycling through each until one came up. Whichever was chosen first depended on timing.
My solution was to add a pre-up sleep command to eth1. This effectively delays it long enough to guarantee that eth0 is selected first.
Here is my configuration:
auto eth0 iface eth0 inet manual bond-master bond0 auto eth1 iface eth1 inet manual # delay ifup to allow eth0 to come up first in the bond pre-up sleep 4 bond-master bond0 auto bond0 iface bond0 inet dhcp bond-mode active-backup bond-miimon 100 bond-slaves eth0 eth1