Throwing bomb lags behind?

The video shows that it throws behind them, then goes to the intended position

function Bomb:Throw()
    -- Create an offset for gravity to give it upward's momentum
    local g = Vector3.new(0, -workspace.Gravity, 0);
    -- Starting position
    local x0 = self.model.PrimaryPart.Position;
    -- Ending position
	local x1 = self.model.Parent.PrimaryPart.CFrame * Vector3.new(0,0,-(self.throwDistance * 2));

    -- Calculate velocity
    local velocity = (x1 - x0 - 0.5*g*self.throwTime*self.throwTime) / self.throwTime;


    for _, v in ipairs(self.model:GetChildren()) do
        v:SetNetworkOwner(nil);
    end

    self.model:FindFirstChild('GripWeld', true):Destroy();
    self.model:SetPrimaryPartCFrame(self.model.Parent.RightHand.RightGripAttachment.WorldCFrame)
    self.model.PrimaryPart.Velocity = velocity;
    print('velocity set')

You might want to take a look at this DevHub article, which explains the behavior you are seeing here.

Pretty much, you will have to fire the grenade locally, and then fire an event to the server (the server will also have to create the grenade to replicate to all clients (I have seen people use the server replicate to all the clients as well. You get a smoother effect but it is more expensive memory-wise)). The explosion should still be server-sided.