To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of acres for growing guavas as \(G\) and the number of acres for growing mangos as \(M\).

The objective is to maximize profit. Given that the profit per acre of guavas is $300 and the profit per acre of mangos is $500, the total profit can be represented by the equation \(300G + 500M\).

There are several constraints based on the problem description:
1. The farmer has 100 acres of land in total, so \(G + M \leq 100\).
2. He prefers to grow more mangos than guavas, but can grow at most 2 times the amount of mangos as guavas, so \(M \leq 2G\).
3. He must grow at least 20 acres of guavas, so \(G \geq 20\).
4. He must grow at least 40 acres of mangos, so \(M \geq 40\).

Given these constraints and the objective function, we can formulate this as a linear programming problem.

Here is how you could represent this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Tropical_Farmer")

# Define the decision variables
G = m.addVar(name='Guavas', vtype=GRB.CONTINUOUS, lb=0)
M = m.addVar(name='Mangos', vtype=GRB.CONTINUOUS, lb=0)

# Set the objective function
m.setObjective(300*G + 500*M, GRB.MAXIMIZE)

# Add constraints
m.addConstr(G + M <= 100, name='Total_Land')
m.addConstr(M <= 2*G, name='Mangos_vs_Guavas')
m.addConstr(G >= 20, name='Min_Guavas')
m.addConstr(M >= 40, name='Min_Mangos')

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Grow {G.x} acres of guavas and {M.x} acres of mangos.")
else:
    print("No optimal solution found.")
```