[Galaxy S II Q&A, Help & Troubleshooting] irhere:
There's also a method for ICS firmwares posted by a commenter on Wanamlite's firmware site. Here's a copy and paste of it:

Here are the instructions to get rid of the +- 50ms home button lag due to the annoying Vlingo. Do this at your own risk.

0. Make a backup. Make a backup. Make a backup.
1. get android.policy.jar
2. extract classes.dex from it
4. use baksmali to decompile classes.dex
5. open bar/com/android/internal/policy/impl/PhoneWindowManager.smali
6. find .line 2048
7. find .line 2050
8. check the patch, and apply it. Note that the exact symbols might change between firmwares. So apply the patch manually. The important part is to remove the if statement that eventually invokes addAction. And second important part is to ensure that the launchHomeFromHotKey is invoked.

— PhoneWindowManager.smali	2012-03-22 19:59:19.000000000 +0100
+++ foo.smali	2012-03-22 19:59:06.000000000 +0100
@@ -7551,80 +7551,7 @@

.line 2048
:cond_15d
- const-string v36, “GT-I9100″
-
- const-string v37, “SGH-I727R”
-
- invoke-virtual/range {v36 .. v37}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
-
- move-result v36
-
- if-nez v36, :cond_1a4
-
- const-string v36, “GT-I9100″
-
- const-string v37, “YP-GB70D”
-
- invoke-virtual/range {v36 .. v37}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
-
- move-result v36
-
- if-nez v36, :cond_1a4
-
- const-string v36, “GT-I9100″
-
- const-string v37, “SGH-T769″
-
- invoke-virtual/range {v36 .. v37}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
-
- move-result v36
-
- if-nez v36, :cond_1a4
-
- .line 2050
- const/16 v36, 0×3
-
- move/from16 v0, v19
-
- move/from16 v1, v36
-
- if-ne v0, v1, :cond_1a4
-
- move-object/from16 v0, p0
-
- iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mHoldKeyConcept:Lcom/android/internal/policy/impl/PhoneWindowManager$HoldKeyConcept;
-
- move-object/from16 v36, v0

- const/16 v37, 0×3
-
- invoke-virtual/range {v36 .. v37}, Lcom/android/internal/policy/impl/PhoneWindowManager$HoldKeyConcept;->isSystemKeyEventRequested(I)Z
-
- move-result v36
-
- if-nez v36, :cond_1a4
-
- .line 2051
- move-object/from16 v0, p0
-
- iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mHomeKeyDoubleClickConcept:Lcom/android/internal/policy/impl/PhoneWindowManager$HomeKeyDoubleClickConcept;
-
- move-object/from16 v36, v0
-
- invoke-virtual/range {p2 .. p2}, Landroid/view/KeyEvent;->getAction()I
-
- move-result v37
-
- move-object/from16 v0, v36
-
- move/from16 v1, v37
-
- move/from16 v2, v26
-
- invoke-virtual {v0, v1, v2, v5}, Lcom/android/internal/policy/impl/PhoneWindowManager$HomeKeyDoubleClickConcept;->addAction(IIZ)V
-
- .line 2060
- :cond_1a4
const/16 v36, 0×3

move/from16 v0, v19
@@ -7672,6 +7599,8 @@

if-nez v8, :cond_28d

+ invoke-virtual/range {p0 .. p0}, Lcom/android/internal/policy/impl/PhoneWindowManager;->launchHomeFromHotKey()V
+
.line 2071
const/16 v36, 0×0

9. save the file
10. recompile the result back to classes.dex
11. rebuild android.policy.jar
12. put the android.policy.jar back

Phone should reboot now. After reboot, the packages have to be reoptimized. Afterwards, enjoy the lagfree home-button click.