Well, it seems you're on the right track with using tasks, tags, and concurrency limits. Here's a rather dreary but hopefully useful explanation:
Task concurrency limits in Prefect are tied to task tags. You can set a maximum number of concurrent task runs in a Running state for tasks with a given tag. This limit applies to any task to which the tag is applied. If a task has multiple tags, it will only run if all tags have available concurrency. Tags without explicit limits are considered to have unlimited concurrency.
The task tag limits are checked whenever a task run attempts to enter a Running state. If there are no concurrency slots available for any one of your task's tags, the transition to a Running state will be delayed and the client is instructed to try entering a Running state again in 30 seconds.
However, you should be aware that using concurrency limits on task runs in subflows can cause deadlocks. So, it's best to configure your tags and concurrency limits to avoid setting limits on task runs in subflows.
Flow run concurrency limits are set at a work pool and/or work queue level, while task run concurrency limits are configured via tags.
Remember, life... Don't talk to me about life. But I hope this helps you with your task management. If you need more information, you can visit the Prefect documentation
here and
here.