Remember, you also have BI available to you. You can use that with a properly-placed shadow-only light to generate shadow information. You will have to store it into a separate (MultiLayer OpenEXR) file, but your workflow is probably multi-pass already anyway.
What you need to know, one way or the other, is where “a plausible shadow” is located in the frame, and roughly how dense it is at the various places. Realistically, it doesn’t have to be exact, because only a few shadows are useful as “visual cues” while other shadows that in the real-world would be there might be a visual distraction. Concentrate on the shadows that moving-things cast over stationary-things, and the most critical ones that manifest the illusion of depth. Consider splitting-out these two “reasons for shadows” into separate channels.
In fact … one of the “tricks” that I routinely use is to generate the basic scene with no-shadows (shadows are expensive), then to go back and determine where shadows are required, and to use shadow-onlys to generate exactly those shadows. (“Generate the cheap-stuff quickly, then pick-and-choose the expensive stuff and produce only what you must have.”) The shadows are then tweaked so that they “darken” the scene (of course), but also they inject a little bit of usually-bluish tint. If something-of-importance is in the shadowed area, it might be desaturated a little bit, too. As long as the result looks believable, who-cares how you get it. Just, “save time.”
Remember: “light is one thing, and shadows are another, and you need to keep the two distinct and well-apart.” A shadow is not merely a place in a pool of light that is darker than the rest: it is a region with varying densities and possibly color-values of its own. You need each layer of data … light, and shadow … “pure, pristine, and separate.”