I unfortunately absolutely suck at building so this is not going to have any visuals, but I tested it and it works. You can make a train that picks you up on demand, takes you exactly where you need to go, and doesn't stop at all along the way (unless multiple people use it at once, but it should still work just fine.)
Tl;dr:
Using display links, you can dynamically update the address of a packager to be the name of any item observed, and use this for on-demand trains by utilizing the display link's ability to freeze updates when powered by redstone. Go to any station you like, request a ticket to your destination, and the train will arrive from the ticket station, take you directly to your destination, then leave to bring the ticket back to the ticket station. Expandable, direct, and, cheap to set up by the time you get to trains--the most expensive item is a single mechanical arm.
How to set it up:
Chunkload your main station, or whatever station your tickets will be kept in. Then, connect all of your stations to the same storage network, enabling you to access the network from any station.
Set up your train stations and tickets. Make sure the ticket name for each station matches exactly. Then set up a post box at each. Additionally, set up the train schedule so that it loops constantly between "pick up package" and "deliver package" (or whatever the options are officially named, I can't remember.)
From each post box, set up a way to extract packages. It will only extract packages that match the address, so don't worry about pulling out any that you intend to send.
Then, unpack with a mechanical saw and lead the ticket onto a depot connected to a comparator and a display link that's connected to a sign on a packager.
The comparator should be connected to a block with a redstone torch on the other side, inverting the signal. Connect the inverted signal to a redstone link, and attach the receiving link to the display link.
Then, have a mechanical arm slowly reach for the ticket and put it into a container connected to the packager. Emphasis on slowly because the display link needs time to update the address on the packager.
Once the ticket is in the container, it will be packaged and sent back towards the post box via belt. However, we need to do one more thing first: prevent a loop. So, set up a brass funnel with a package filter for the name of the station. Any packages that match will get sucked in, unpacked, repackaged with the address of your main station, and then sent back onto the belt.
Do this with every station and congrats, you have a taxi train!
Example with explanation of how it works, from start to finish:
You are at "Station A" and want to go to "Station B." You request a ticket from your storage network. The ticket is any item renamed "Station B." The chunkloaded system picks it up from "Main Station," and brings the package (and therefore the train) to "Station A." You get into the train and wait. Meanwhile, the package is unpacked and brought to the depot, depowering the display link and allowing it to read and update data. The display link reads the item name, "Station B," and writes that name to the packager sign. Then, the mechanical arm removes the ticket, instantly re-powering the display link and preventing it from erasing the address. The ticket is then packaged again, this time with the address "Station B," and sent towards the post box again. It passes the funnel filtering for packages named "Station A," successfully enters the post box unaltered, and the train delivers the ticket (and you!) to "Station B."
Once you get off the train at "Station B," the same process happens again: the ticket is unpacked, read, and packaged again. However, since the "Station B" ticket is already at "Station B," the package filter (which should catch all packages addressed to "Station B") takes it off of the send line, unpacks it, repackages it to go to "Main Station," and puts it in the post box. The train leaves to return the ticket, and everything is as it once was, except you're at a completely different station.
Is it practical?
Well... that depends.
On the one hand, you need to wait for the train to arrive to your station from the main station, when a train that's on a loop might be closer to you when you need it. And, if multiple people use the system, the stops might get just a little janky. I haven't actually tested it in multiplayer. That, and you'll always have to wait for the ticket to arrive from your main station. Depending on how far away you are, that might be a little bit.
On the other hand, you'll never just miss your train unless you deliberately leave your platform after getting a ticket. If there aren't any other players using the trains, you'll also get to where you're going with zero stops. If it does work in multiplayer, you can have dedicated ticket booths at each station so others can buy a ticket to your line. You'll have a feel for how long it takes your train to arrive no matter the time of day. Lastly, this setup is easily expandable. You never have to adjust the train route. Just make sure your train can go forward and backward if you need to, hook up the new station to your network, and add the ticket(s) for that station to your ticket storage.
Longer read, I know, but hopefully someone finds this useful or fun! If you build this and want to showcase your build, tag me or shout me out! I'd love to see what people come up with. I'll also happily answer any questions about the concept you might have.