My opinion is probably obvious given Tornado 5.1/6.0, but just for the record:
If you were starting today, I don't think there's any question that you'd go entirely with the `async def` style and wouldn't worry about callbacks (except as provided through `Future.add_done_callback` for callers who really want them). So this is really a question about how you feel about maintaining or breaking backwards compatibility.
I tend to think that for async code in python, the benefits of moving to Python 3.5 and native coroutines are very compelling. There are certainly some users committed to the callback-based mode, so I'm tying the removal of callbacks in Tornado to dropping Python 2, which is also going to leave some users behind. For those users, older versions remain available so they won't lose anything, but they won't get new features or support going forward.
The appropriate decision varies depending on what kind of library you're building. I'm planning to continue to support Python 2 in the `cockroachdb` package after I've dropped it from Tornado, for example. For `motor`, I could see continuing Python 2 and callback support by the same logic, since the goal is to enable asynchronous access to MongoDB, and you want the largest audience possible (and you don't want users on older versions to have trouble accessing new database features).