What about TweenService makes this not work? There are methods to do exactly what you’re looking for if you mess with the EaseDirection, EaseStyle, and Time properties of a Tween.
If you’re running the Tween on the client, it’s always smooth (it’ll only be laggy if the user’s framerate is low). If you want something without doing it through TweenService, you’re gonna spend a lot of time doing math. A suggestion is to use EasingDirection Out or In (I can’t remember the way it goes, because I usually just switch them), and try different EasingStyles such as Quint, Cubic, or Exponential which all look similar to what you are trying to acheive. Read this page for more info on the different EasingStyles, and this page which is for the entire TweenService if you are confused about that.