Why this doesn't actually close the problem
A batched bulk job gives you a number for the day you ran it. It says nothing about the records created an hour later.
Every channel that doesn't go through the native duplicate detection dialog, Web API inserts, Power Automate flows, Dual-Write syncs, is still writing new records the whole time you're working through your batches. (We've written separately about how Web API inserts bypass duplicate detection by default, which is worth a read if integrations are a big part of how records land in your environment.) A bulk job, however carefully batched, is a snapshot. It tells you where things stood, not where they stand.
That's fine as an occasional audit. It's not a process you'd want to run your data quality on. The batching overhead scales with data volume, not down from it, so the bigger the environment gets, the more manual tracking the workaround demands, right as it becomes least practical to keep up with by hand.
What actually closes the gap
A batched bulk job only ever solves half of this. It gets you caught up once (Clean), but it does nothing about the records created the moment after the job finishes (Prevent). Run one without the other and you're not closing the backlog, you're re-opening the same batching exercise on a recurring schedule.
Plauti for Dynamics 365 CE runs both inside your own Dataverse environment, installed from Microsoft Marketplace. Bulk detection has no 5,000-record ceiling and covers standard and custom entities, not just the three Microsoft ships default rules for, and the same rules check records arriving through the API, so integrations stop adding to the pile while you're clearing it. If you're mid-cleanup and want a number that doesn't depend on how many batches you remembered to run: plauti.com/crm/microsoft-dynamics.