Polynomial interpolation in the sense that you use it is probably not the best idea if you want it to go through all your points. You have 24 points for which a polynomial of order 23 is needed if it needs to go through all the points. I cannot use poly with a power of 23, but using a lower power is already enough to show you why this will not work:
ggplot(d) + geom_point(aes(x = hour, y = impressions, colour = cvr), size = 3) + stat_smooth(aes(x = hour, y = impressions), method = "lm", formula = y ~ poly(x, 21), se = FALSE) + coord_cartesian(ylim = c(0, 1.5e7))

This more or less goes through all the points (and indeed, if I could manage to use a polynomial with a higher order), but otherwise it is probably not the smooth curve you want. The best option is to use interpolation with splines . It is also an interpolation that uses polynomials, but instead of using only one (as you tried), it uses a lot. They forcefully pass through all data points so that your curve is continuous.
As far as I know (and maybe I'm wrong) this cannot be done directly with ggplot, so I will show you a solution where spline interpolation is created in a separate step:
spline_int <- as.data.frame(spline(d$hour, d$impressions))
You need as.data.frame because spline returns a list. Now you can use this new data on the chart using geom_line() :
ggplot(d) + geom_point(aes(x = hour, y = impressions, colour = cvr), size = 3) + geom_line(data = spline_int, aes(x = x, y = y))

Stibu source share