If you're not running 11.2 as mentioned in MartinThe's answer, you can try this...
So, I manage my test scripts such that they can run in multiple test environments - Dev, SIT, UAT, etc. I start each script with a folder called "Prepare Test Data", and within that folder is usually just multiple Set Buffer steps. This folder is the key to driving the differences between environments.
To start with, I use a Test Configuration Parameter called "TestEnvironment". Because this is a test configuration parameter, it can be attached directly to test cases or test case folders, and it cascades down onto any test cases contained within... So, I set the TCP to "SIT" in my blue section because I develop all my automation scripts using my SIT environment to play around in. When Executing, I also use TCP "TestEnvironment" on my execution lists(Green section), because TCPs found there override TCP's from the blue section. So, although my test scripts are set to "SIT", my execution lists can be set to "DEV" or "UAT", and while executing via execution list, they run with the TCP set to that.
Next, within the "Prepare Test Data" block, I set up my switching buffers. The plan here is for all of the test steps within the script to just use simple basic buffers like "Username", "Instrument Ref#", etc. So, the Prepare Test Data block preloads those buffers with the data for the test, but it's switched depending on which environment I'm running the script in. I'll use the buffer "Username" as an example...
In the first Set Buffer block, I create three buffers like this:
Username-DEV = "Fred"
Username-SIT = "TestUser1"
Username-UAT = "TestDude"
{(*advanced note) Sometimes my scripts are more advanced and I pull data from Test Case Design test sheets... In that case, the above would look something more like this: Username-SIT = "{XL[Test Data.Users.Clerk User.SIT]}", where the datasheet would have all the different users, usually stored in TCD classes... I could discuss that in a different topic...}
In the next Set Buffer step, I then switch the buffer to it's final value that the test steps will use like this:
Username = "{B[Username-{CP[TestEnvironment]}]}"
So, in this example, if TestEnvironment is set to SIT, then Username gets set to the value of Username-SIT, which is "TestUser1" . This switching happens live during the test run.
(*Advanced note:) You have to use separate Set Buffer steps because Tosca seems to execute all parts of a single "step" sequentially-simultaneously. What I mean by that is that the buffer for "Username-SIT" won't exist until the first Set Buffer step completes, so if you combine the assignment for Username buffer in the same step, it will crash.(or use an old, possibly wrong value)
Below this, all of my test steps can use basic buffers like "Username" instead of "Username-SIT" because they've all been "switched".
Using this technique, and to specifically answer your question, I would also use Tosca IF blocks to separate modules being used. For example, in my test enviroments, one of my login screens between SIT and UAT is so different that I can't use the same module for both. So, a simple IF block can switch it.
IF
Condition
TBox Evaluation tool
Expression = "{CP[TestEnvironment]} == "SIT"
Then
SIT-version of module
Username = "{B[Username]}"
Else
UAT-version of module
Username - "{B[Username]}" <-- can use same buffer because its' already switched
Naturally, you can stack "IF-ELSE-IF" blocks if you need more than two environments/versions. I hope you get the idea.