Summary: FilletEdge cannot resolve the intersection of the fillets at the point where the two cylinders meet at a tangent, it leaves a gap. A clean way out of this situation, with a solution that uses all rolling-ball filleting is to back up and use FilletSrf rather than FilletEdge, and do all the trimming “by hand” once the fillet surfaces are created
First, build all the fillet surfaces.
Now, ExtendSrf the upper edge of the lower cylinder a bit as in the image. Create a fillet surface between the upper fillet and the lower cylinder - (this is the transition surface that is not made by FilletEdge) UntrimBorder this surface as well.
If you look closely at the ends if the fillet created in the previous step, you'll see that it peters out just barely short of the actual tangent point - this needs to be fixed or there will likely be a naked edge at this location when it's all done and joined up. To fix this, since it is so close to the correct point, turn on control points for the fillet surface and window select just the points at the very tip. Use SetPt to snap these to the seam point on the upper fillet.
Now it is a matter of trimming all of these surfaces to one another.
Mirror this surface to the other side (Center osnap on the lower cylinder edge works well to set up a mirror axis in this case, then use Ortho (Shift key) to force the axis as needed to get the surface mirrored to the other side) Using Sub-object selection (Ctrl-Shift click) to select the edges of the tapered fillet, Trim the lower of the first two fillets