My ds5 is 2y 5m. He doesn't sleep in the day anymore and rarely sleeps at night before 9pm, sometimes later. I follow a bedtime routine, same as with my other children but he just won't stay in bed. It was ok when he was smaller as he would sit in his cot and look at his books, chatter to himself etc but then he learnt to climb out of his cot.
I kept putting him back in but I was up and down the stairs all evening. I tried being in the room with him but that didn't help either. At the weekend we moved him out of the cot and into a bed but that didn't help either.
The only thing that seems to work is a 2-3 hour session at the park or softplay as it seems to wear him out enough so that he is sleepy at 7pm. I can't do that every day though, for one thing it's expensive. Our nearest park is a bus ride away so can't even do that for free. TBH though I'm so desperate for my evenings back I'm considering daily softplay trips.
Your issue seems to be he doesn't view "bedtime" as a time to go to sleep, it's a time to occupy himself until he feels tired and then go to sleep. I wouldn't have encouraged books, toys, playing, chattering etc at bedtime. I take the view that bedtime is the time to lie down, be quiet and go to sleep. And nothing else.
That's not an easy thing to solve now he's older. Especially so if he's no longer 'penned in' with a cot. I would stay with him and ensure bedtime is always as boring as possible from going to bed until going to sleep.
Be consistent. It needs to work at the other end of the day too. If you are to establish that bedtime is sleep time. Then he shouldn't be left to occupy himself when he wakes in the morning either.
Just to be clear, reading a bedtime story together just before bed is absolutely fine and no need to ditch this. But I would definately ditch all activities after "bedtime" (for now at least) to encourage the idea that bedtime is sleep time