What problems did you face with cycling directions?
Regarding the route shapes I can only guess: we use an encoded polyline as default for a very compact response. You can either disable this or use our JavaScript library, or there is a new UI https://github.com/graphhopper/graphhopper-maps
Regarding routing parameters: our custom_model approach is more powerful than simple parameters and still not complicated: https://www.graphhopper.com/blog/2020/05/31/examples-for-cus... See e.g. the several bike examples and see how to get an world wide instance up and running: https://www.graphhopper.com/blog/2022/06/27/host-your-own-wo...
In recent master you can additionally control how elevation influences your route (e.g. prefer or avoid them entirely or steep sections or similar)