Some context on BulkMoveTo.
The release notes description is actually a bit inaccurate as the feature went through a few changes as I developed it and I forgot to update the release notes description after updating the API to the final version.
As for how it works, the enum argument gives you full control over the behavior:
FireAllEvents => The move will behave exactly the same as if you had just looped over the parts and assigned the .CFrame property on each of them. Though with slightly better performance because the reflection layer only has to be crossed once total, instead of once for each property set.
FireCFrameChanged => The move behaves almost the same as with FireAllEvents. The only difference is that you won’t get Position / Orientation / Rotation changed events. The CFrame changed event you do get is sufficient for replication / undo history etc to work. This variant will have much better performance than the above in studio, where multiple parts of studio are listening for every property change being made on an instance, since 4x less property changes have to be pushed through those handlers.
FireNoEvents => This lets you move parts purely physically. They will move to the new location, but only their physics information will be updated, no events will be fired. Since replication and change history are based off of property changed events, changes made with this mode will not be replicated, and will not be part of the change history. This lets you move parts around to speculatively test for collisions / raycast hits much more cheaply than you could before.
The API is introduced so that the Lua Draggers Beta can much more efficiently move the parts in the selection around when dragging. Dragging large models, thanks to this API, should be almost 5x more performant than with the legacy draggers.