Cross-project predecessors are a necessity for us for certain product lines.
A few years ago, we split the development of our core annual learning products into front-end and back-end projects. The front-end projects (or modules) contain content development tasks (writing, copyediting, etc.), and each project is akin to a book chapter. The back-end projects (or deliverables) are the for-sale formats of a course and feature different workflows depending on the format.
We use cross-project predecessors to link the modules and deliverables. So, we may have course family AAA, with 8 module projects: AAA24-01, AAA24-02, etc. The Course 1 deliverable might be made up of content from all 8 modules, while the Course 2 deliverable might include mods 1-3, 5.
Having cross-project predecessors does enable us to know when the back-end deliverable projects can/should launch (the system we used prior to WF didn't have cross-project predecessors, and we had to manually track the mod/dev relationships to know when to launch the back-end projects).
Reporting is a bit challenging. Because we have multiple back-end projects relying upon the same front-end modules (and because those back-end workflows can vary), we can't use a single milestone path across the front- and back-ends. One workaround we've used is to create a task report (consisting of the back-end launch tasks where the cross-project predecessors reside) and use a collection to show the cross-project predecessors and their respective completion percentages).