This looks like it might have something to do with network ownership. Try setting network ownership of all the worm’s parts to the server. Something like this:
--wait for worm to be parented to workspace for :SetNetworkOwner() to work (if script is inside of worm then the wait will likely be done automatically)
local worm = script.Parent
for i,v in pairs(worm:GetDescendants()) do
if v:IsA("BasePart") then
v:SetNetworkOwner(nil) --setting to nil is the same as setting to server
Instead of setting to server, for overall better results, you can set the network owner to the client and control the worm on the client, but this wouldn’t be ideal unless the game were single-player or unless you don’t mind inconsistencies between clients.
Hope this is actually the problem, though. If not, I’ll be happy to look into it more.