Es una limitación general de todos los bucles "foreach": desde dentro del bucle no se puede modificar la propia colección que el bucle está recorriendo en ese momento.
Un remedio sencillo consiste en copiar la colección (por ejemplo con .ToiList), y recorrer la copia con el bucle pero borrar de la colección original en lugar de la copia que se está recorriendo:
foreach (Control item in Compo.Controls.OfType<Button>().ToList())
{
Compo.Controls.Remove(item);
}