If the tree example is representative, where the destinations the AI tend to bunch up at are "job sites," then you can solve this by using a claim system.
When an AI goes looking for a job to do, it searches for the nearest unclaimed job site. Then it places a claim on that job site before proceeding.
The next AI to search for unclaimed job sites of the same type won't be assigned the same one, because it's already been claimed.
When an AI needs to stop work (has a full load of wood to bring back, changes jobs, gets interrupted, dies) it releases its claim so that it doesn't gum up the works with claims that aren't currently in use.
One issue with this system is that if it acts globally, it can give the AI a kind of clairvoyance. Each one knows what every other is doing and which job sites will be in use, even if nobody's nearby yet. This can lead to strange behaviour like an AI who's been ordered to chop wood walking away from the tree right next to them (because it's been claimed by another AI who's still pathing over from the far side of the map).
To solve this you can introduce some hierarchy & local awareness to it. Say, have a resource patch entity that encompasses many trees. It knows how much harvesting capacity it has, and AI pathing from a long distance away can register their claim with the patch itself. Only once they get close do they bother claiming an individual tree. That way the coordination looks more like what can be accomplished with regular senses & shouted updates, rather than ESP or a central traffic control system. ;)