I think I had the same issue while trying to create bombs that explode when they hit the ground. The position of the explosions was always mid-air and was set by taking the position of the bomb at the time the .Touched event fired. The issue I think is that the position of the part gets updated a short while AFTER the .Touched event fired. A simple solution for me was making a raycast to see where the bomb or in this case your fireball would hit another object.
hitbox.Position=workspace:Raycast(part.Position,part.Velocity).Position