Все же злоупотреблять эвентами не надо.
Лучше всего их для чего-то редкого использовать.
Если эвент какой-то будет по тысяче раз каждый кадр срабатывать будет фигово.
is_dirty флаг можно было бы просунуть в саму ecs. В спексе раньше можно было фильтровать даже entity у которых до этого выставлен флаг у нужного компонента. А выставлялся он при мутабельной итерации по этому компоненту. Даже если мутации не произошло.
В bevy есть такой флаг, за счёт специальной обёртки вокруг компонентов получаемых системой. Обёртка имплементит DerefMut, и выставляет внутри себя флаг в true если такой deref случился.
И есть возможность в запросах использовать Changed<MyComponentType>. Только вот видимо не везде это используется внутри самого Bevy