You can achieve what you want for your 2nd and 3rd type of comments with this:
(setq fortran-comment-indent-style 'relative)
(add-hook 'fortran-mode-hook (lambda () (setq comment-column 0)))
For your 1st type comments, you need a hack like the following:
(defadvice fortran-indent-line (after custom-indentation activate)
(save-excursion
(forward-line 0)
(when (looking-at "*")
(forward-char 1)
(just-one-space))))
EDIT
Honoring your last comment requires a more complex and uglier hack. Replace the previous defadvice
by this one:
(defadvice fortran-indent-line (around custom-indentation activate)
(let ((type-* (save-excursion
(forward-line 0)
(looking-at "\s*\\*")))
(type-! (save-excursion
(forward-line 0)
(looking-at "\s*!"))))
(if type-!
(progn
(save-excursion
(forward-line 0)
(re-search-forward "!")
(replace-match "__"))
ad-do-it
(save-excursion
(forward-line 0)
(re-search-forward "__")
(replace-match "!"))
)
(if (not type-*)
ad-do-it))))