To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of small gifts as \(S\) and the number of large gifts as \(L\). The profit per small gift is $3, and per large gift is $5. So, the total profit can be represented as \(3S + 5L\).

We have two constraints:
1. **Worker Time Constraint**: Each small gift takes 10 minutes to wrap, and each large gift takes 15 minutes. The kiosk has 720 minutes available.
   - This constraint can be written as: \(10S + 15L \leq 720\).
2. **Wrapping Paper Constraint**: Small gifts require 2 units of wrapping paper, and large gifts require 3 units. There are 150 units of wrapping paper available.
   - This constraint can be represented as: \(2S + 3L \leq 150\).

Both \(S\) and \(L\) must be non-negative since the number of gifts cannot be negative.

Now, we want to maximize the profit \(3S + 5L\) under these constraints. 

Here is how you can implement this in Gurobi using Python:

```python
from gurobipy import *

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

# Define variables
S = m.addVar(vtype=GRB.INTEGER, name="SmallGifts")
L = m.addVar(vtype=GRB.INTEGER, name="LargeGifts")

# Objective function: Maximize profit
m.setObjective(3*S + 5*L, GRB.MAXIMIZE)

# Constraints
m.addConstr(10*S + 15*L <= 720, "TimeConstraint")
m.addConstr(2*S + 3*L <= 150, "PaperConstraint")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Small Gifts: {S.x}")
    print(f"Large Gifts: {L.x}")
    print(f"Total Profit: ${3*S.x + 5*L.x:.2f}")
else:
    print("No optimal solution found. The model is likely infeasible.")

```