To solve this optimization problem, we need to define the decision variables, objective function, and constraints. Let's break down the problem step by step.

1. **Decision Variables**: We have two salads, so our decision variables will be the number of Caesar salads (let's call it `x`) and the number of Mediterranean salads (let's call it `y`).

2. **Objective Function**: The objective is to maximize profit. Given that each Caesar salad gives a profit of $7 and each Mediterranean salad gives a profit of $9, our objective function can be written as: Maximize `7x + 9y`.

3. **Constraints**:
   - **Lettuce Constraint**: Each Caesar salad uses 100g of lettuce, and each Mediterranean salad uses 150g. The total available lettuce is 20,000g. So, the constraint is `100x + 150y <= 20000`.
   - **Sauce Constraint**: Each Caesar salad uses 10g of sauce, and each Mediterranean salad uses 15g. The total available sauce is 2,000g. So, the constraint is `10x + 15y <= 2000`.
   - **Cheese Constraint**: Each Caesar salad uses 5g of cheese, and each Mediterranean salad uses 15g. The total available cheese is 3,000g. So, the constraint is `5x + 15y <= 3000`.
   - **Non-Negativity Constraints**: Since we cannot produce a negative number of salads, both `x` and `y` must be greater than or equal to 0.

Now, let's translate these into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Salad_Optimization")

# Decision Variables
x = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Caesar_Salads")
y = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Mediterranean_Salads")

# Objective Function
m.setObjective(7*x + 9*y, GRB.MAXIMIZE)

# Constraints
m.addConstr(100*x + 150*y <= 20000, "Lettuce_Constraint")
m.addConstr(10*x + 15*y <= 2000, "Sauce_Constraint")
m.addConstr(5*x + 15*y <= 3000, "Cheese_Constraint")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Caesar Salads: {x.x}")
    print(f"Mediterranean Salads: {y.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```