Are there any better alternatives?
Emacs 27 (officially released 2020-08-11) added support for a fill-column indicator natively by way of the buffer-local minor mode[1] display-fill-column-indicator-mode and its global counterpart global-display-fill-column-indicator-mode.
For example, you can enable it in most programming language modes by adding something like the following hook[2] to your user-init-file (i.e. your init.el or .emacs file):
(add-hook 'prog-mode-hook #'display-fill-column-indicator-mode)
By default, the indicator appears in a column that varies across buffers according to the value of fill-column.
To default to a fixed column number, you can add one of the following (equivalent) expressions to your user-init-file:
;; Since Emacs 29:
(setopt display-fill-column-indicator-column 80)
;; Alternatively, in Emacs 28 or prior:
(setq-default display-fill-column-indicator-column 80)
Here is the fill-column indicator in action:

Quoth (info "(emacs) Displaying Boundaries"):
14.15 Displaying Boundaries
===========================
Emacs can display an indication of the ‘fill-column’ position (see
Fill Commands). The fill-column indicator is a useful functionality
especially in ‘prog-mode’ and its descendants (see Major Modes) to
indicate the position of a specific column that has some special meaning
for formatting the source code of a program.
To activate the fill-column indication display, use the minor modes
‘M-x display-fill-column-indicator-mode’ and
‘M-x global-display-fill-column-indicator-mode’, which enable the
indicator locally or globally, respectively.
Alternatively, you can set the two buffer-local variables
‘display-fill-column-indicator’ and
‘display-fill-column-indicator-character’ to activate the indicator and
control the character used for the indication. Note that both variables
must be non-‘nil’ for the indication to be displayed. (Turning on the
minor mode sets both these variables.)
There are 2 buffer local variables and a face to customize this mode:
‘display-fill-column-indicator-column’
Specifies the column number where the indicator should be set. It
can take positive numerical values for the column, or the special
value ‘t’, which means that the value of the variable ‘fill-column’
will be used.
Any other value disables the indicator. The default value is ‘t’.
‘display-fill-column-indicator-character’
Specifies the character used for the indicator. This character can
be any valid character including Unicode ones if the font supports
them. The value ‘nil’ disables the indicator. When the mode is
enabled through the functions ‘display-fill-column-indicator-mode’
or ‘global-display-fill-column-indicator-mode’, they will use the
character specified by this variable, if it is non-‘nil’; otherwise
Emacs will use the character ‘U+2502 VERTICAL LINE’, falling back
to ‘|’ if ‘U+2502’ cannot be displayed.
‘fill-column-indicator’
Specifies the face used to display the indicator. It inherits its
default values from the face ‘shadow’, but without background
color. To change the indicator color, you need only set the
foreground color of this face.
(set-window-margins nil 0 (max (- (window-width) 80) 0))So if you have a 120 character wide window, it'll shrink the space you have to actually display code to 80 characters. This way it won't mess up your window configuration and you can toggle it on an off if you'd like. If you have fringes, there will actually be a line drawn at 80 columns.