zu Problem Nr. 1:
In meiner Antwort steht, dass du das als Thread starten musst - schaut aber nicht so aus....

Wenn du deine Klasse nicht verändern willst, kannst du eine anonyme Klasse machen:

Code:
 Thread thread = new Thread ()  {
      public void run () {
         System.out.println("Start...");
         // hier deine Klasse starten
      }   
   };
   thread.start();
zu Problem Nr. 2+3:
Möglicherweise löst der Thread auch gleich das Problem - oder machst du eine system.exit?

Problem Nr. 3:
Beim Listener kannst du in contextDestroyed den Dienst sauber beenden:

Variante 1:
thread.interrupt(); im Dienst die Exception verarbeiten, sprich alles zumachen. Im Listener/contextDestroyed das Ende des Threads abwarten thread.join oder thread.join(x); wobei x die Zeit ist, wie lange man wartet.

Variante 2:
Du übergibst an den Thread eine Objektreferenz, über welche du dann mit dem Dienst kommunzierst und z.B. eine Ende anfordern kannst.

Problem Nr. 4
Sollte so eigentlich funktionieren???

Problem Nr. 5
1. Man kann den Tomcat als Dienst beenden oder über das Wartungstool. Das würde auch deinen Dienst beenden.
2. Man kann ein Servlet/JSP machen. Also einfach einen Webeinstieg ohne Manager sondern über eigene HTML Seiten.
3. Jede andere Möglichkeit, wie sie auch bei einem normalen Javaprogramm vorkommt (also Flags über DataQueue, Socket, Datei......)