to get the proportions you want stat_count() requires to have just one group so you cant apply fill = cyl, if you want more flexibility, calculate the proportions yourself and use geom_col()
library(tidyverse)
ggplot(data = mpg) +
geom_bar(mapping = aes(x = factor(cyl), y = stat(prop), group = 1), stat = "count") +
geom_text(mapping = aes(label = stat(scales::percent(prop)), x = factor(cyl), y = stat(prop), group=1), stat = "count", vjust=-.5)

mpg %>%
group_by(cyl) %>%
summarise(n = n(), .groups = "drop") %>%
mutate(cyl = factor(cyl), prop = n/sum(n)) %>%
ggplot(aes(x = cyl, y = prop, fill = cyl)) +
geom_col() +
geom_text(aes(label = scales::percent(prop)))

Created on 2021-09-10 by the reprex package (v2.0.1)