OK, den Unterschied zwischen „toRemove“ und „Iterator“ zu messen ist in mehrerer Hinsicht schwierig.
Erstens wegen der üblichen Schwierigkeiten bei Java Microbenchmarks (die hast du Ansatzweise zu vermeiden versucht, z.B. das Problem des JIT durch die mehrfache Ausführung, aber … wenn die Ergebnisse so eines Tests nicht verwendet werden, kann der ja optimieren, was er will).
Zweitens hängt die Performance massivst von den konkreten Daten ab. Wie groß der Unterschied zwischen „toRemove“ und „Iterator“ ist, hängt z.B. davon ab, ob man eine Liste mit 1000000 Elementen hat, und davon 999999 entfernt, oder nur 1. Aber da ich nicht davon ausgehe, dass du 1000000 Animationen ablaufen läßt, von denen 999999 gleichzeitig fertig sind, wäre so ein Test in bezug auf den konkreten Anwendungsfall ohnehin nur sehr begrenzt aussagekräftig 
Wie gesagt, mir ist nicht klar, wo der Listener in diese Diskussion reinkam. Auf Basis des bisher beschriebenen würde ich denken, dass es „toRemove“ oder Iterator schon tun, und es um Listen geht, bei denen sich beide in bezug auf die Performance nicht viel nehmen…
*** Edit ***
Als Nachtrag: Bei der „ConcurrentModificationException“ muss man grob in zwei Kategorien einteilen: Die, die vom selben Thread verursacht werden, und die, die durch concurrent Zugriffe entstehen. Sowas wie
for (Object object : list)
{
if (someCondition) list.remove(object);
}
wird eine Exception werfen, auch bei EINEM Thread. Dabei spielt es auch keine Rolle, ob dieses „remove“ quasi „von hinten durch die Brust ins Auge“ über einen Listener erfolgt: Das Problem ist, dass die Liste verändert wird, während man drüberiteriert.
Sowas wie
for(int i = 0; i < objects.size(); i++)
{
if (someCondition) {
objects.remove(objects.get(i));
i--;
}
}
ist etwas anders. Dort fliegt keine Exception, weil es ja keinen Iterator gibt, der einen Zustand hätte, der durch die Änderungen gestört wird. Aber wie man sieht, muss man händisch die Schleifenvariable (i–) anpassen, was IMHO grundsätzlich häßlich ist, und spätestens dann nicht mehr so leicht funktioniert, wenn das „remove“ an ganz anderer Stelle, versteckt, in einem Listener gemacht wird.
In BEIDEN Fällen bekommt man zusätzliche Probleme, wenn auf die Liste mit mehreren Threads zugegriffen wird, und man das nicht berücksichtigt. Wenn man sowas hat wie
List<String> list = new ArrayList<String>();
list.add("x");
void removeElement()
{
list.remove("x");
}
und die „removeElement“ gleichzeitig von zwei Threads ausgeführt wird, kann der Zustand der Liste danach schlicht inkonsistent sein (also, richtig kaputt… GROB in dem Sinne, dass sie z.B. eine size() von -1 haben könnte (nicht genau das, aber grob in dem Sinne))