What to and how to proceed with CPT to make DB small and efficient?

The native WordPress way would be to register a custom post type for “Routes” and then Taxonomies for “Stops” and “Buses”.

Using Custom Fields you can handle the start and end time. You can add Meta Fields to the Post Type, so you don’t have to declare the custom fields each time. Here’s a tutorial for that: https://premium.wpmudev.org/blog/creating-meta-boxes/

I don’t know that WordPress will store it as efficiently as your table structure. Each custom field value will be its own row in the Post Meta table. But, this is the way WordPress is built and they’ve got it dialed in.

You should be able to use the native search to handle Buses, Routes, and Stops. And any description fields. If you store departure and return times as Custom Fields, you’d need to extend WP Query to look for those. Here’s a tutorial: https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/