A severe limitation to #3 is the extra buy-in of the application and why almost all UI libraries use #2. A ModalConductor needs to be added as a sibling to the content of the application. I also have to define every modal in the entire app in ModalConductor. This may be okay for smaller applications and for situations where there aren’t many apps supported by the same implementation (the target of UI libraries).
dispatch(openModal(<someModalBody />)) can’t without special middleware as actions need to be plain objects: https://github.com/reactjs/redux/issues/437#issuecomment-129211619