To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of small bowls sold as `x` and the number of large bowls sold as `y`. The objective is to maximize profit, which can be calculated as $5x + 8y$ since each small bowl generates a profit of $5 and each large bowl generates a profit of $8.

We also need to consider the constraints based on the availability of kiwi, mango, and pineapple. For kiwi, the constraint is $3x + 5y \leq 100$ because each small bowl contains 3 units of kiwi and each large bowl contains 5 units, and there are only 100 units available. Similarly, for mango, the constraint is $2x + 4y \leq 120$, and for pineapple, it's $5x + 8y \leq 150$.

Additionally, we have non-negativity constraints since the number of bowls sold cannot be negative: $x \geq 0$ and $y \geq 0$.

Here is how we can represent this problem using Gurobi in Python:

```python
from gurobipy import *

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

# Define the decision variables
x = m.addVar(name="small_bowls", vtype=GRB.CONTINUOUS, lb=0)
y = m.addVar(name="large_bowls", vtype=GRB.CONTINUOUS, lb=0)

# Set the objective function: Maximize profit
m.setObjective(5*x + 8*y, GRB.MAXIMIZE)

# Add constraints based on fruit availability
m.addConstr(3*x + 5*y <= 100, name="kiwi_constraint")
m.addConstr(2*x + 4*y <= 120, name="mango_constraint")
m.addConstr(5*x + 8*y <= 150, name="pineapple_constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Sell {x.x} small bowls and {y.x} large bowls.")
    print(f"Maximum profit: ${5*x.x + 8*y.x}")
else:
    print("No optimal solution found.")
```