Rather than looping over children, clone the whole object in one go and parent it.
The next best thing is to loop over each child and parent it to a Folder or Model in nil, and then parenting that Folder or Model to the workspace. This is still a good bit slower than just cloning the whole thing and parenting it.
The reason is actually pretty intuitive I think. Basically, every time you set the parent of an object, Roblox will cause an event, and, it will collect some information about what you are parenting to give to the client. Roblox will then send that information on the next frame, and if the client doesn’t have the instance already it will send all of the data about the instance.
By cloning and setting the parent of each object individually, you cause those events and you cause Roblox to send lots of new data lots of times. If you parent only one object, you only create those events once, you only send the entire instance once, and, since there is a bit of extra data that has to go with each object the amount of data Roblox has to send and process is a lot lower.
If your scripts require everything to be in the workspace, you should definitely edit them and use a variable to decide where to look for map objects, that way you can change it easily if you want to. Usually I would recommend never parenting directly to workspace and instead using a few Folders or Models to hold lots of instances in. For example, you might have a folder called Map which contains the entire map, and, for dynamic objects which you create at different times you might have, for example, a Vehicles folder which has a bunch of vehicles you can drive.
@nicemike40 Also has a pretty good suggestion, but it can cause a lot of lag if you just merge a bunch of parts into unions. I would only recommend it in some cases since it can cause a lot of lag depending on the shapes you are unioning and how many unions you are creating.
The reason is that Roblox can batch render things more efficiently than it can render a large amount of unions. Unions can also increase the triangle count (but can also decrease it depending on what you are unioning) because, while a part might have 12 triangles, merging two parts could create a situation where 20 triangles are needed to represent the shape without having any intersecting triangles.
And, because unions have mesh data, too many unions can use a lot more memory than a bunch of parts would. There is a balance, you don’t want too many unions, but, you don’t want too many parts.
Somewhat recently Roblox added a feature to view things in wireframe mode. This lets you see all of the triangles in your objects. You can find it under View > Wireframe Rendering:
If you want to spend the time to do this, I would recommend only unioning unique models with a really large amount of parts. This would reduce how much data has to get sent, and, is more likely to reduce the triangle count.