There are several algorithms designed for one-dimensional clustering. Among most widely known are Jenks natural breaks, method designed Fisher (1958) and K-means algorithm. Basically, all the three algorithms are very similar since they aim at minimizing within-cluster sum of squares.
All the (and other) methods are implemented in classInt library for R. Using Fisher method or K-means seems to work well given the limited data sample you provided (see below). Since the algorithms are quite simple, it should not be a problem to run them on larger amounts of data.
library(classInt)
x <- c(1, 2, 3, 2, 2, 3, 4, 2, 80, 90, 80, 85, 91)
classIntervals(x, style = "fisher", n = 2)
## style: fisher
## one of 7 possible partitions of this variable into 2 classes
## [1,42) [42,91]
## 8 5
classIntervals(x, style = "kmeans", n = 2)
## style: kmeans
## one of 7 possible partitions of this variable into 2 classes
## [1,42) [42,91]
## 8 5
The problematic part of the methods is that, like with any of the clustering approaches, they do not provide you any fool-proof method on deciding about the number of clusters to look for. There are rules of thumb and algorithms (e.g. here, here, or here) that in some cases make the choice simpler, but they are far from perfect and the final choice is always somehow subjective. In many cases the choice is simpler with model-based clustering, where there are available methods for model comparison, however those methods output clustering solutions with fuzzy, rather than "cutting point", boundaries (you could check mixtools package for examples).
Fisher, W. D. (1958). On grouping for maximum homogeneity. Journal of the American Statistical Association, 53, 789–798.