Can you try this code. I havenâ€™t tested it though

local DISTANCE_FROM_CHARACTER = 6
local ROTATION_SPEED = 1 -- Set to negative if you want to go backwards
local FOLLOW_SPEED = 5
local run = game:GetService'RunService'
local cos = math.cos
local sin = math.sin
local hrp:Part = char.HumanoidRootPart
local newModel = Instance.new'Model'
local pos = hrp.Position
local vectorX = Vector3.new(DISTANCE_FROM_CHARACTER,0,0)
local vectorZ = Vector3.new(0,0,DISTANCE_FROM_CHARACTER)
local circle:Part = game.ReplicatedStorage.Circle:Clone()
circle.Position = pos*vectorX
circle.Parent = newModel
local circle2:Part = game.ReplicatedStorage.Circle:Clone()
circle2.Position = pos*vectorZ
circle2.Parent = newModel
local circle3:Part = game.ReplicatedStorage.Circle:Clone()
circle3.Position = pos-vectorX
circle3.Parent = newModel
local circle4:Part = game.ReplicatedStorage.Circle:Clone()
circle4.Position = pos-vectorZ
circle4.Parent = newModel
local rotation = 0
newModel.Parent = workspace
run.Heartbeat:Connect(function(dt)
rotation += dt*ROTATION_SPEED
pos = pos:Lerp(hrp.Position,dt*FOLLOW_SPEED)
local sin = sin(rotation)*DISTANCE_FROM_CHARACTER
local cos = cos(rotation)*DISTANCE_FROM_CHARACTER
circle.Position = pos+Vector3.new(sin,0,cos)
circle2.Position = pos+Vector3.new(cos,0,sin)
circle3.Position = pos+Vector3.new(-sin,0,-cos)
circle4.Position = pos+Vector3.new(-cos,0,-sin)
end)

RunService is not laggy. The lag depends on how efficient the code is. I ran my code 1000 times per Heatbeat and I was getting ~8ms of lag. I also ran it 10 000 times per Heartbeat and I was getting ~40ms of lag. I donâ€™t know how many you will run it but Iâ€™m pretty sure itâ€™s not more than 1000.

oh than u could just have 3 parts rig 1 main part 1 supportiv part which is in main part and the rotating part which is rigged to supportiv part and just do how fast u want the part to spin ussing animator with supportiv part and make it have its own humanoid and u will just need to make it so the 3 part model is unanchored and it loads the animation and so it just welds main part with the humanoidrootpart in humanoid root parts position(sorry if its hard to understand i could make simple demo to show what i mean)