Hey, yeah there's lots of optimisations to make if I had time. It's actually most likely the cost of the steering behaviours that causes the lag, rather than instancing stuff. Each boid has to iterate over each other boid (to determine avoidance steering) so there's O(n^2) scaling, and GDScript is not particularly fast to begin with.
Thanks for the nice comments!