Any kind of cyclic dependencies between bundles is not best practice. Some of the downsides are that you cannot reuse either bundle without the other and if you make a change in either bundle, you need to re-test them both.
The alternative of bundles with acyclic dependencies has the advantages of a layered architecture.
A downside of using an optional dependency for something that really is mandatory is that, if it the dependency is not satisfied, then you won't get the ideal failure behaviour.
But if you are converting legacy code, it is often necessary to make these kinds of compromises in the short term and clean up later.