This is the first time I've ever worked with pathfinding and npcs but I went in and worked on it until I got results but when running it's clear that it's poor optimised. It does what it needs to do but is there any way I can put less stress on the server?

local pathFindingService = game:GetService("PathfindingService")

local humanoid = script.Parent.Humanoid
local body = script.Parent:FindFirstChild("HumanoidRootPart") or script.Parent:FindFirstChild("Torso")

local path = pathFindingService:CreatePath()

function ClothingStore()
	
	local path = pathFindingService:CreatePath()
	
	-- Enter Shop
	
	local cse = game.Workspace.clothingstoreenter
	local csl = game.Workspace.clothingstoreleave
	
	path:ComputeAsync(body.Position, cse.Position)
	
	local waypoints = path:GetWaypoints()
	
	for k, waypoint in pairs(waypoints) do
		humanoid:MoveTo(waypoint.Position)
		
		if waypoints.Action == Enum.PathWaypointAction.Jump then
			humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		end
		
		humanoid.MoveToFinished:Wait()
	end
	
    body.CFrame = csl.CFrame
	
	-- Find Clothing
	
	local csp = game.Workspace.points:GetChildren()
	local cspd = csp[math.random(1, #csp)]
	
	path:ComputeAsync(body.Position, cspd.Position)
	
	local waypoints = path:GetWaypoints()
	
	for k, waypoint in pairs(waypoints) do
		humanoid:MoveTo(waypoint.Position)
		
		if waypoints.Action == Enum.PathWaypointAction.Jump then
			humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		end
		
		humanoid.MoveToFinished:Wait()
	end

	-- Purchase Clothing
	
	wait(math.random(3, 7))
	
	local csc = game.Workspace.clothingstorecashpoint
	
	path:ComputeAsync(body.Position, csc.Position)
	
	local waypoints = path:GetWaypoints()
	
	for k, waypoint in pairs(waypoints) do
		humanoid:MoveTo(waypoint.Position)
		
		if waypoints.Action == Enum.PathWaypointAction.Jump then
			humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		end
		
		humanoid.MoveToFinished:Wait()
	end
	
	-- Leave
	
	wait(math.random(3, 7))
	
	local cse = game.Workspace.clothingstoreenter
	local csl = game.Workspace.clothingstoreleave
	
	path:ComputeAsync(body.Position, csl.Position)
	
	local waypoints = path:GetWaypoints()
	
	for k, waypoint in pairs(waypoints) do
		humanoid:MoveTo(waypoint.Position)
		
		if waypoints.Action == Enum.PathWaypointAction.Jump then
			humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		end
		
		humanoid.MoveToFinished:Wait()
	end
	
    body.CFrame = cse.CFrame

	-- Home
	
	local sp = game.Workspace.spawnpoint
	
	path:ComputeAsync(body.Position, sp.Position)
	
	local waypoints = path:GetWaypoints()
	
	for k, waypoint in pairs(waypoints) do
		humanoid:MoveTo(waypoint.Position)
		
		if waypoints.Action == Enum.PathWaypointAction.Jump then
			humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
		end
		
		humanoid.MoveToFinished:Wait()
	end
	
	script.Parent:remove()
	
end

ClothingStore()