To solve this optimization problem, we need to define the decision variables, objective function, and constraints. Let's denote the number of shuttlecocks as `x` and the number of volleyballs as `y`.

The profit per shuttlecock is $3.5, and the profit per volleyball is $10. So, the total profit can be represented by the objective function: `3.5x + 10y`.

The constraints are based on the available time for sewing and quality checking:
- Each shuttlecock requires 15 minutes of sewing, so `x` shuttlecocks will require `15x` minutes.
- Each volleyball requires 20 minutes of sewing, so `y` volleyballs will require `20y` minutes.
- The total sewing time available is 4000 minutes, leading to the constraint: `15x + 20y <= 4000`.
- For quality checking:
- Each shuttlecock requires 5 minutes, so `x` shuttlecocks require `5x` minutes.
- Each volleyball requires 10 minutes, so `y` volleyballs require `10y` minutes.
- The total quality checking time available is 3000 minutes, leading to the constraint: `5x + 10y <= 3000`.
- Additionally, we cannot produce a negative number of products, so `x >= 0` and `y >= 0`.

To maximize profit using Gurobi in Python, we'll set up these variables and constraints:

```python
from gurobipy import *

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

# Decision variables: number of shuttlecocks (x) and volleyballs (y)
x = m.addVar(lb=0, name="shuttlecocks")
y = m.addVar(lb=0, name="volleyballs")

# Objective function: Maximize profit
m.setObjective(3.5*x + 10*y, GRB.MAXIMIZE)

# Constraints:
# Sewing time constraint
m.addConstr(15*x + 20*y <= 4000, "sewing_time")
# Quality checking time constraint
m.addConstr(5*x + 10*y <= 3000, "quality_checking")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Produce {x.x:.0f} shuttlecocks and {y.x:.0f} volleyballs.")
else:
    print("No optimal solution found. The problem might be infeasible.")

```