I stumbled on a similar use case, not sure whether it will suit the above mentioned needs but Clustering
in OL 5 is what I adopted.
Clustering as the words suggests takes a group of points and merge them togther in a single point e.g. you have 100 points in particular city all the points will be visible as one point from a zoom of let's say 4
but as individual points from a zoom of let's say 10
so what you can do is when the zoom is 4
you can join those points as one, what this does it helps reducing the number of points to be rendered in a particular area.
In other words, let's say you have 10,000 points to be rendered on the map and they are pretty close to each other, so you can make clusters of them and reduce rendering and when the user zooms in you keep breaking the clusters. This will ensure that you have less rendering and better performance.
Satisfying performance. Link to Clustering examples on Openlayers