For the one case where I had to actually remove data, I asked my management what they thought would be reasonable. The government approach was that if I could keep a record of the information in any other format, just so we could call it up if someone asked about it later, I could do the deletion.
I wrote code to visit the items marked for delete. For each one, I created a file based on the name of the object being deleted. Since we had a "unique names" requirement (even though the name wasn't the PK), we could make a unique filename for it. I built a text file using VBA Open & Print statements. For each record in the child recordsets, we had a delete flag too. When we visited a record marked for deletion we marked its child records, too. Anyway, as this code looped its way through the child records, we made it a point to print everything from the records in the file, then when we traversed the child records we printed everything about them, too. Afterwards, we deleted every child record we had marked in passing. When we were finished, we deleted the parent record, closed the file, and reported success. Then, once per month, we took all of the files made this way for each of the things requiring this treatment and build a zip file with a name including the year & month plus a prefix of the type of things in that particular file. The zip files, we were planning on keeping forever.
I know my colleagues will know that, but I wanted to show an example of how to do this without losing data due to a cascade deletion.